package com.bms.service.impl;

import com.bms.common.response.ActivityResponse;
import com.bms.entity.Activity;
import com.bms.entity.Budget;
import com.bms.mapper.ActivityMapper;
import com.bms.mapper.BudgetMapper;
import com.bms.service.ActivityService;
import com.bms.utils.IdWorker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * Description:
 * Author: jingcaiqi1225@gmail.com
 * Date: 2024/10/29 17:12
 */
@Service
public class ActivityServiceImpl implements ActivityService {

    @Autowired
    private ActivityMapper activityMapper;

    @Autowired
    private BudgetMapper budgetMapper;

    /**
     * 获取活动总数
     *
     * @return 活动总数
     */
    @Override
    public Integer getCount() {
        return activityMapper.getCount();
    }

    /**
     * 添加新活动
     *
     * @param activity 待添加的活动对象
     * @return 添加结果，通常为受影响的行数
     */
    @Override
    public Integer addActivity(Activity activity) {
        // 为活动设置一个唯一的ID
        activity.setActivityId(IdWorker.getOrderCode(1));

        // 根据线路ID获取预算信息
        Budget budget = budgetMapper.getBudgetByBudgetId(activity.getBudgetId());

        // 检查可用预算是否足够覆盖活动预算
        if (budget.getAvailableBudget().compareTo(activity.getActivityBudget()) >= 0) {

            // 更新已使用预算
            budgetMapper.updateUsedBudget(budget.getUsedBudget().add(activity.getActivityBudget()), budget.getBudgetId());
            // 调用Mapper层方法添加活动到数据库
            return activityMapper.addActivity(activity);
        }
        // 如果预算不足，返回0表示添加活动失败
        return 0;
    }

    /**
     * 获取搜索活动的总数
     *
     * @param params 搜索参数，用于指定搜索条件
     * @return 搜索到的活动总数
     */
    @Override
    public int getSearchCount(Map<String, Object> params) {
        return activityMapper.getSearchCount(params);
    }

    /**
     * 根据搜索条件分页查询活动
     *
     * @param params 包含分页和搜索参数的Map对象
     * @return 搜索结果列表，包含按条件筛选的活动
     */
    @Override
    public List<ActivityResponse> searchActivitiesByPage(Map<String, Object> params) {
        return activityMapper.searchActivitiesByPage(params);
    }

    /**
     * 更新活动信息
     *
     * @param activity 需要更新的活动对象，包含修改后的信息
     * @return 更新结果，通常为受影响的行数
     */
    @Override
    public Integer updateActivity(Activity activity) {
        return activityMapper.updateActivity(activity);
    }

    /**
     * 更新活动状态
     *
     * @param activity 包含活动ID和新状态的活动对象
     * @return 更新结果，通常为受影响的行数
     */
    @Override
    public Integer updateStatus(Activity activity) {
        // 调用Mapper层方法更新活动状态
        return activityMapper.updateStatus(activity.getActivityId(), activity.getStatus());
    }

    /**
     * 获取活动选择列表
     *
     * 本方法通过调用activityMapper的getActivitiesSelectList方法来获取活动列表，
     * 主要用于需要显示或处理活动列表的场景，例如活动选择界面或后台管理系统中的活动管理模块
     *
     * @return 活动列表，包含所有可用的活动对象
     */
    @Override
    public List<Activity> getActivitiesSelectList() {
        return activityMapper.getActivitiesSelectList();
    }

    /**
     * 更新活动状态
     * <p>
     * 此方法用于更新数据库中某个活动的状态信息
     * 它调用了ActivityMapper中的相应方法来执行更新操作
     *
     * @param activity 活动对象，包含需要更新的状态信息
     */
    @Override
    public void updateActivityStatus(Activity activity) {
        activityMapper.updateActivityStatus(activity);
    }
}
